﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// @brief 定义了一个形状类，用于处理游戏中的形状移动、旋转和下落逻辑。
/// </summary>
public class Shape : MonoBehaviour
{
    /// <summary>
    /// 形状的旋转中心点。
    /// </summary>
    private Transform pivot;

    /// <summary>
    /// 控制类实例，用于访问游戏控制和模型。
    /// </summary>
    private Ctrl ctrl;

    /// <summary>
    /// 游戏管理器实例，用于访问游戏状态和控制。
    /// </summary>
    private GameManager gameManager;

    /// <summary>
    /// 是否暂停形状下落。
    /// </summary>
    private bool isPause = false;

    /// <summary>
    /// 是否加速形状下落。
    /// </summary>
    private bool isSpeedup = false;

    /// <summary>
    /// 计时器，用于控制形状下落的频率。
    /// </summary>
    private float timer = 0;

    /// <summary>
    /// 每步下落的时间间隔。
    /// </summary>
    private float stepTime = 0.8f;

    /// <summary>
    /// 加速下落时的倍数。
    /// </summary>
    private int multiple = 15;

    /**
     * @brief 初始化方法，在对象觉醒时调用。
     */
    private void Awake()
    {
        Debug.Log("[Shape] Initializing shape component...");
        pivot = transform.Find("Pivot");
        Debug.Log("[Shape] Shape component initialization completed");
    }

    /**
     * @brief 每帧更新方法，处理形状的下落和输入控制。
     */
    private void Update()
    {
        if (isPause) return;
        timer += Time.deltaTime;
        if (timer > stepTime)
        {
            timer = 0;
            Fall();
        }
        InputControl();
    }

    /**
     * @brief 初始化形状的颜色和控制对象。
     * 
     * @param color 形状的颜色。
     * @param ctrl 控制类实例。
     * @param gameManager 游戏管理器实例。
     */
    public void Init(Color color, Ctrl ctrl, GameManager gameManager)
    {
        Debug.Log("[Shape] Initializing shape with color and controllers");
        foreach (Transform t in transform)
        {
            if (t.tag == "Block")
            {
                t.GetComponent<SpriteRenderer>().color = color;
            }
        }
        this.ctrl = ctrl;
        this.gameManager = gameManager;
        Debug.Log("[Shape] Shape initialization completed");
    }

    /**
     * @brief 处理形状下落逻辑。
     */
    private void Fall()
    {
        Vector3 pos = transform.position;
        pos.y -= 1;
        transform.position = pos;
        if (ctrl.model.IsValidMapPosition(this.transform) == false)
        {
            Debug.Log("[Shape] Shape reached invalid position, stopping fall");
            pos.y += 1;
            transform.position = pos;
            isPause = true;
            bool isLineclear = ctrl.model.PlaceShape(this.transform);
            if (isLineclear) 
            {
                Debug.Log("[Shape] Line clear detected");
                ctrl.audioManager.PlayLineClear();
            }
            gameManager.FallDown();
            return;
        }
        ctrl.audioManager.PlayDrop();
    }

    /**
     * @brief 处理玩家输入控制形状移动和旋转。
     */
    private void InputControl()
    {
        // 处理左右移动
        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D))
        {
            float h = Input.GetKeyDown(KeyCode.A) ? -1 : 1;
            Debug.Log($"[Shape] Moving shape {(h > 0 ? "right" : "left")}");
            Vector3 pos = transform.position;
            pos.x += h;
            transform.position = pos;
            if (ctrl.model.IsValidMapPosition(this.transform) == false)
            {
                Debug.Log("[Shape] Movement invalid, reverting");
                pos.x -= h;
                transform.position = pos;
            }
            else
            {
                ctrl.audioManager.PlayControl();
            }
        }

        // 处理旋转
        if (Input.GetKeyDown(KeyCode.W))
        {
            Debug.Log("[Shape] Rotating shape counter-clockwise");
            transform.RotateAround(pivot.position, Vector3.forward, -90);
            if (ctrl.model.IsValidMapPosition(this.transform) == false)
            {
                Debug.Log("[Shape] Rotation invalid, reverting");
                transform.RotateAround(pivot.position, Vector3.forward, 90);
            }
            else
            {
                ctrl.audioManager.PlayControl();
            }
        }

        // 处理加速
        if (Input.GetKeyDown(KeyCode.S))
        {
            if (!isSpeedup)
            {
                Debug.Log("[Shape] Speed up activated");
                isSpeedup = true;
                stepTime /= multiple;
            }
        }
        else if (Input.GetKeyUp(KeyCode.S))
        {
            if (isSpeedup)
            {
                Debug.Log("[Shape] Speed up deactivated");
                isSpeedup = false;
                stepTime *= multiple;
            }
        }
    }

    /**
     * @brief 暂停形状下落。
     */
    public void Pause()
    {
        Debug.Log("[Shape] Pausing shape movement");
        isPause = true;
    }

    /**
     * @brief 恢复形状下落。
     */
    public void Resume()
    {
        Debug.Log("[Shape] Resuming shape movement");
        isPause = false;
    }
}